# @Time :  
# @Author : Fioman 
# @Phone : 13149920693
"""
cv2.add(src1,src2,dst=None,mask=None,dtype=None):
功能:对两张相同大小和类型的图像进行加法运算,或者是对一张图像与一个标量进行加法运算.
- 如果两个arrays具有相同的形状和通道,那么就是对应的位置相加,组合成新的图像.
- 如果是一个图像和一个标量,这个标量含有的元素的个数,必须是和前面的图像的通道的个数是相同的.如果不同,只会加到第一个
  通道上面,这里如果是numpy运算直接+一个标量,这个标量会广播,编程和前面同样形状的进行相加
  如果不相同,那么
   那么就是每个像素位置的对应通道的数值和这个标量的对应数值相加.
- src1: 第一个输入数组或者是一个标量
- src2: 第二个输入数组或者是一个标量
- dst: 输出数组,和输入数组具有相同的形状和通道,图像的depth由dtype定义或者是src1/双人床
- mask:一个8位的单通道的数组,用来确定哪些数据会被改变.掩膜必须是和a,b相同的形状的,非0的位置结果保持,是0的部分,结果就是0.
- dtype:输出数组的数据类型,图像位深度

cv2.add(src1,src2) 这种加法是饱和运算,大于255 => 255
image1 + image2 => numpy 加法,是取模运算 大于255 => val % 256
"""
import cv2
import numpy as np

a = np.array([i for i in range(16)], dtype=np.uint8).reshape(4, 4)
b = np.ones((4, 4), dtype=np.uint8) * 250
imageAddCv = cv2.add(a, b)  # cv2.add() Opencv加法,饱和运算 > 255 => res = 255
imageAddNp = a + b  # Numpy 加法: 取模运算: 大于255 => res % 256
print("\n a = {}".format(a))
print("\n b = {}".format(b))
print("\n addCv = {}".format(imageAddCv))
print("\n addNp = {}".format(imageAddNp))

# cv2.add() 和标量进行相加.比如上面的可以这么去写
addScalarCv = cv2.add(a, 250)
addScalarNp = a + 250
print("\n addScalarCv = {}".format(addScalarCv))
print("\n addScalarNp = {}".format(addScalarNp))

# 假如是彩色图像,是否可以直接加一个数字呢?
c = np.array([i for i in range(27)], dtype=np.uint8).reshape(3, 3, 3)
print("colorA  =  \n{}".format(c))

addScalarCv = cv2.add(c, 250)
print("a \n = {}".format(c))
addScalarNp = c + 250
print("\n addScalarCv = {}".format(addScalarCv))  # 注意这里如果是彩色图像加一个标量得到的结果不太一样
print("\n addScalarNp = {}".format(addScalarNp))

# 先验证mask是不是一定要和a和b具有相同的数据类型,和形状
# maskDifShape = np.ones((3, 3), dtype=np.uint8)
# imageAddCvDifShape = cv2.add(a, b, mask=maskDifShape)
# 报错了,mask和a和b必须具有相同的形状,这里也是很好理解的,因为mask是掩膜,掩膜的作用原理就是
# a 和 b 先做运算,最后再和mask做位与运算,所以他的形状必须是和前面的形状相同的
# 掩膜的作用就是用来确定哪些值留下,哪些值被变为0,掩膜的值只有0和非0之分,其他的非0的值都会被当成1
# 和前面的结果做位于,也不是当成1,就是掩膜这里如果是非0,会变成FF,就是11111111和前面的值做位与,而为0的
# 地方就是0和前面做位于,前面的结果无论是什么值和0做位于还是0
maskSameShape = np.eye(4, dtype=np.uint8) * 255
print("a.shape: {}, b.shape: {}, maskSameShape: {}".format(a.shape, b.shape, maskSameShape.shape))
resMask = cv2.add(a, b, mask=maskSameShape)
print("resMask : \n {}".format(resMask))
